package com.alex.maze.graphics;

import com.alex.maze.Art;

public class Bitmap
{
    public final int BSIRINA;
    public final int BVISINA;
    public final int[] pikseli; // Za one koji neznaju ovo je niz!
    private static final String chars = "" + //
            "ABCDEFGHIJKLMNOPQRSTUVWXYZ.,!?\"'/\\<>()[]{}" + //
            "abcdefghijklmnopqrstuvwxyz                " + //
            "0123456789+-=*:;@                         " + //
            "";

    /*  Konstruktor sa parametrima*/
    public Bitmap(int sirina, int visina)
    {
        BSIRINA = sirina;
        BVISINA = visina;
        pikseli = new int[sirina * visina]; // Ovde odredjujemo velicinu niza!
    }
    
    /*
        !Srz iscrtavanja grafike!
        xOfset je horizontalni ofset.
        yOfset je vertikalni ofset.
        A sta je ofset? Pogledaj: http://en.wikipedia.org/wiki/Offset_%28computer_science%29
        xPoz (xPozicija) je pozicija horizontalnog piksela.
        yPoz (yPozicija) je pozicija vertikalnog piksela.
        xPiksel je vrednos xPoz i xOfset-a.
        Sto znaci da ako je xPoz jednaka 0 a xOfset jednaka 2 onda je vrednost
        xPiksela jednaka 2 sto znaci da smo vrednost piksela koji je trebao da bude
        na poziciji 0 sada na poziciji 2 i samim tim mi smo ofsetovali ne samo jedan
        piksel nego celu sliku! Isto vazi i yPiksel!
        Oba if statementa sluze da ne bi smo dobili OutOfBoundsException.
        Kao sto znamo OOBE je zao! Zato mi lepo ogranicimo x/yPiksele da ne mogu
        da predju te granice! !!!NOTE!!! Pocetna vrenost xPiksela i yPiksela
        je uvek 0! Krajna vrednos xPiksela je sirna rezolucije koju ste zadali!
        Krajna vrednos yPiksela je visina rezolucije koju ste zadali!
        pikseli[] = bitmapa.pikseli bice dole detaljnije objasnjena!
    */
    public void draw(Bitmap bitmapa, int xOfset, int yOfset)
    {
        for(int yPoz = 0; yPoz < bitmapa.BVISINA; yPoz++)
        {
            int yPiksel = yPoz + yOfset;
            if (yPiksel < 0 || yPiksel >= BVISINA)
            {
                continue;
            }
            for(int xPoz = 0; xPoz<bitmapa.BSIRINA; xPoz++)
            {
                int xPiksel = xPoz + xOfset;
                if (xPiksel < 0 || xPiksel >= BSIRINA)
                {
                    continue;
                }
                /*
                    Ovde dodeljujemo pojedinacnu vrednost pikselima!
                    Evo na primer probjate ovo: pikseli[xPiksel + yPiksel * BSIRINA] = 0xFFFFFF;
                    Sada samo treba da vidite belu kvadrat!
                */
                // NEMOJ DA ZABORAVIS ---> Bitmasking ne radi kako treba...
                // Pravi artefakte pri skrolovanju!
                int src = bitmapa.pikseli[xPoz + yPoz * bitmapa.BSIRINA];
                //if (src > 0) // Bitmasking support
                //{
                    pikseli[xPiksel + yPiksel * BSIRINA] = src;
                //}
            }
        }
    }
    
    public void flipDraw(Bitmap bitmapa, int xOfset, int yOfset)
    {
        for(int yPoz = 0; yPoz < bitmapa.BVISINA; yPoz++)
        {
            int yPiksel = yPoz + yOfset;
            if (yPiksel < 0 || yPiksel >= BVISINA)
            {
                continue;
            }
            for(int xPoz = 0; xPoz < bitmapa.BSIRINA; xPoz++)
            {
                int xPiksel = xOfset + bitmapa.BSIRINA - xPoz - 1;
                if (xPiksel < 0 || xPiksel >= BSIRINA)
                {
                    continue;
                }
                /*
                    Ovde dodeljujemo pojedinacnu vrednost pikselima!
                    Evo na primer probjate ovo: pikseli[xPiksel + yPiksel * BSIRINA] = 0xFFFFFF;
                    Sada samo treba da vidite belu kvadrat!
                */
                // NEMOJ DA ZABORAVIS ---> Bitmasking ne radi kako treba...
                // Pravi artefakte pri skrolovanju!
                int src = bitmapa.pikseli[xPoz + yPoz * bitmapa.BSIRINA];
                //if (src > 0) // Bitmasking support
                //{
                    pikseli[xPiksel + yPiksel * BSIRINA] = src;
                //}
            }
        }
    }
    
    public void draw(Bitmap bitmapa, int xOfset, int yOfset, int xo, int yo, int w, int h, int col)
    {
        for(int yPoz = 0; yPoz < h; yPoz++)
        {
            int yPiksel = yPoz + yOfset;
            if (yPiksel < 0 || yPiksel >= BVISINA) //....?
            {
                continue;
            }
            for(int xPoz = 0; xPoz< w; xPoz++)
            {
                int xPiksel = xPoz + xOfset;
                if (xPiksel < 0 || xPiksel >= BSIRINA) // Isto i ovde...?
                {
                    continue;
                }
                /*
                    Ovde dodeljujemo pojedinacnu vrednost pikselima!
                    Evo na primer probjate ovo: pikseli[xPiksel + yPiksel * BSIRINA] = 0xFFFFFF;
                    Sada samo treba da vidite belu kvadrat!
                */
                // NEMOJ DA ZABORAVIS ---> Bitmasking ne radi kako treba...
                // Pravi artefakte pri skrolovanju!
                int src = bitmapa.pikseli[(xPoz + xo) + (yPoz + yo) * bitmapa.BSIRINA];
                if (src > 0) // Bitmasking support
                {
                    pikseli[xPiksel + yPiksel * BSIRINA] = src * col;
                }
            }
        }
    }
    
    public void draw (String string, int x, int y, int col)
    {
        for (int i = 0; i < string.length(); i++)
        {
            int ch = chars.indexOf(string.charAt(i));
            int xx = ch % 42;
            int yy = ch / 42;
            
            if (ch < 0)
            {
                continue;
            }
            draw(Art.font, x + i * 6, y, xx * 6, yy * 8, 7, 8, col);
        }
    }
}
